package com.designPattern.command.controller;

import com.designPattern.command.command.Command;
import com.designPattern.command.command.EmptyCommand;
import com.designPattern.command.command.OffCommand;
import com.designPattern.command.command.OnCommand;

/**
 * 【命令模式】
 * 【解决问题】在软件设计中我们常常会向某个对象发送请求，但我么并不知道接受者是谁，也不知道被请求者操作是哪一个
 * 【解决方案】设计一个命令接口，规定了命令的具体的方法
 * 子类在实现接口的时候聚合一个命令的具体接受者（真正能执行方法的对象，例如被遥控控制的灯）
 * 子类通过调用命令接受者的方法完成接口中的方法
 *
 * 设计一个”中心控制器“，可以接受命令，通过调用命令的方法完成对接受者（空调）的控制
 * 完成了命令执行者和接受者的解耦，只需要知道命令，就可以完成对接受者的控制
 *
 * 【源码】jdbcTemple中的query()方法
 *
 * @author mxs
 */
public class RemoteController {
    Command[] onCommands= new OnCommand[5];
    Command[] offCommands= new OffCommand[5];
    Command undoCommand = new EmptyCommand();

    public RemoteController() {
        for (Command onCommand : onCommands) {
            onCommand = new EmptyCommand();
        }
        for (Command offCommand : offCommands) {
            offCommand = new EmptyCommand();
        }
        undoCommand = new EmptyCommand();
    }

    public void setCommand(int i, OnCommand onCommand, OffCommand offCommand){
        onCommands[i] = onCommand;
        offCommands[i] = offCommand;
    }
    public void on(int i){
        onCommands[i].execute();
        undoCommand = onCommands[i];
    }
    public void off(int i){
        offCommands[i].execute();
        undoCommand = offCommands[i];
    }
    public void undo(){
        undoCommand.undo();
    }

}
